/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dominosaude.dominoesView;

import dominosaude.dominoesControler.DominoesControl;
import dominosaude.dominoesControler.Tile;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author pedromedeiros
 */
public class MesaDominous extends JPanel {

    private JLabel jogador1;
    private JLabel jogador2;
    private JLabel QuadroMensagems = new JLabel();

    private ArrayList apresentacaoMaoJ1 = new ArrayList();
    private ArrayList apresentacaoMaoJ2 = new ArrayList();
    private ArrayList apresentacaoPecasMesa = new ArrayList();

    private DominoesControl controle = new DominoesControl();

    public MesaDominous()
    {
        setBackground(new Color(147,122,96));
        setLayout(null);
        setBounds(10, 10, 700, 400);

        jogador1 = new JLabel("Jogador 1");
        jogador1.setBounds(10, 20, 200, 20);
        add(jogador1);

        jogador2 = new JLabel("Jogador 2");
        jogador2.setBounds(10, 300, 200, 20);
        add(jogador2);

    }

    public void processaJogada(Tile tile)
    {

        if (controle.realizaJogadaJ1(tile))
        {
            desenhaPecas();
            System.out.println("verdadeiro");
        }else
            System.out.println("falso");
        
    }

    public void processaJogadaIndex(int index,int Jogador)
    {


        if (Jogador == 1)
        {
            if (controle.realizaJogadaJ1Index(index))
            {
                desenhaPecas();
                System.out.println("verdadeiro");
            }else
                System.out.println("falso");
        }else
        {
            if (controle.realizaJogadaJ2Index(index))
            {
                desenhaPecas();
                System.out.println("verdadeiro");
            }else
                System.out.println("falso");

        }

    }

    public void MPprocessaJogadaIndex(int index, int Jogador)
    {
        if (Jogador == 1)
        {
            if (controle.realizaJogadaJ1Index(index))
            {
                MPdesenhaPecas();
                System.out.println("verdadeiro");
            }else
                System.out.println("falso");
        }else
        {
            if (controle.realizaJogadaJ2Index(index))
            {
                MPdesenhaPecas();
                System.out.println("verdadeiro");
            }else
                System.out.println("falso");

        }
    }

    public void ComecaJogo1Jogador()
    {
        controle.novoJogo1Jogador();
        desenhaPecas();
        
    }

    public void ComecaJogo2Jogadores(DominoesControl.PlayOnlineStatus s) throws RemoteException, AlreadyBoundException
    {
        if (s == DominoesControl.PlayOnlineStatus.HOST_WAITING)
        {
            controle.novoJogo2Jogadores(this);
        }
        else if (s == DominoesControl.PlayOnlineStatus.CLIENT_WAITING)
        {
            controle.conectaJogo2jogadores(this);
        }
        // desenhaPecas();
    }

    private void QuadroAvisos(String aviso)
    {
        if (aviso == null)
        {
            QuadroMensagems.setBounds(650, 5, 150, 90);
            QuadroMensagems.setBackground(Color.gray);
            QuadroMensagems.setText("sem mensagem");
            add(QuadroMensagems);
        }else
        {
            QuadroMensagems.setBounds(650, 5, 150, 90);
            QuadroMensagems.setBackground(Color.gray);
            QuadroMensagems.setText(aviso);
            add(QuadroMensagems);
        }

    }

    public void desenhaPecas()
    {
        // declarações
        int aux;
        Tile tileAux;
        
        System.out.println("Desenha Pecas normal");
        if (apresentacaoMaoJ1.size() != 0)
        {
            apresentacaoMaoJ1.clear();
        }

        if (apresentacaoMaoJ2.size() != 0)
        {
            apresentacaoMaoJ2.clear();
        }

        if (apresentacaoPecasMesa.size() != 0)
        {
            apresentacaoPecasMesa.clear();
        }

        removeAll();

        // desenhaTAbuleiro
        setBackground(new Color(147,122,96));
        setLayout(null);
        setBounds(10, 10, 800, 400);

        jogador1 = new JLabel("Jogador 1");
        jogador1.setBounds(10, 20, 200, 20);
        add(jogador1);

        jogador2 = new JLabel("Jogador 2");
        jogador2.setBounds(10, 300, 200, 20);
        add(jogador2);


        // desenha pecas que estão na mão do jogador 1
        aux = controle.getMaoJogador1().size();
        for (int i = 0; i < aux; i++)
        {
            tileAux = (Tile) controle.getMaoJogador1().get(i);
            JLabel j = new JLabel(new ImageIcon(tileAux.getVerdicalPecaURL()));
            j.setBounds(5+(i*42),40,39,58);
            add(j);
            j.addMouseListener(new mousePecasListenner());
            apresentacaoMaoJ1.add(j);
        }


        // desenha pecas que estão na mão do jogador 2
        aux = controle.getMaoJogador2().size();
        for (int i = 0; i < aux; i++)
        {
            tileAux = (Tile) controle.getMaoJogador2().get(i);
            JLabel j = new JLabel(new ImageIcon(tileAux.getVerdicalPecaURL()));
            j.setBounds(5+(i*42),330,39,58);
            add(j);
            j.addMouseListener(new mousePecasListenner());
            apresentacaoMaoJ2.add(j);
        }


        // desenha pecas da mesa
        aux = controle.getPecasMesa().size();
        for (int i = 0; i < aux; i++)
        {
            tileAux = (Tile) controle.getPecasMesa().get(i);
            JLabel j = new JLabel(new ImageIcon(tileAux.getVerdicalPecaURL()));
            j.setBounds(5+(i*42),200,39,58);
            add(j);
            apresentacaoPecasMesa.add(j);
        }

        //JLabel j = new JLabel(new ImageIcon(t.getVerdicalPecaURL()) );

        // TODO: Desenhar as peccas

       QuadroAvisos(controle.getTextoAviso());
       repaint();
    }


    public void MPdesenhaPecas()
    {
        // declarações
        int aux;
        Tile tileAux;

        System.out.println("MPDesenhaPecas");

        if (apresentacaoMaoJ1.size() != 0)
        {
            apresentacaoMaoJ1.clear();
        }

        if (apresentacaoMaoJ2.size() != 0)
        {
            apresentacaoMaoJ2.clear();
        }

        if (apresentacaoPecasMesa.size() != 0)
        {
            apresentacaoPecasMesa.clear();
        }

        removeAll();

        // desenhaTAbuleiro
        setBackground(new Color(147,122,96));
        setLayout(null);
        setBounds(10, 10, 800, 400);

        jogador1 = new JLabel("Jogador 1");
        jogador1.setBounds(10, 20, 200, 20);
        add(jogador1);

        jogador2 = new JLabel("Jogador 2");
        jogador2.setBounds(10, 300, 200, 20);
        add(jogador2);


        // desenha pecas que estão na mão do jogador 1
        aux = controle.getMaoJogador1().size();
        for (int i = 0; i < aux; i++)
        {
            tileAux = (Tile) controle.getMaoJogador1().get(i);
            JLabel j;
            if (controle.hideTileJ1() == true )
            {
                j = new JLabel(new ImageIcon(tileAux.getVerticalPecaURLNULL()));
            }else
            {
                j = new JLabel(new ImageIcon(tileAux.getVerdicalPecaURL()));
                j.addMouseListener(new mousePecasListenner());
            }
            j.setBounds(5+(i*42),40,39,58);
            add(j);
            apresentacaoMaoJ1.add(j);
        }


        // desenha pecas que estão na mão do jogador 2
        aux = controle.getMaoJogador2().size();
        for (int i = 0; i < aux; i++)
        {
            tileAux = (Tile) controle.getMaoJogador2().get(i);
            JLabel j;
            if (controle.hideTileJ2() == true )
            {
                j = new JLabel(new ImageIcon(tileAux.getVerticalPecaURLNULL()));
            }
            else
            {
                j = new JLabel(new ImageIcon(tileAux.getVerdicalPecaURL()));
                j.addMouseListener(new mousePecasListenner());
            }
            j.setBounds(5+(i*42),330,39,58);
            add(j);
            apresentacaoMaoJ2.add(j);
        }


        // desenha pecas da mesa
        aux = controle.getPecasMesa().size();
        for (int i = 0; i < aux; i++)
        {
            tileAux = (Tile) controle.getPecasMesa().get(i);
            JLabel j = new JLabel(new ImageIcon(tileAux.getVerdicalPecaURL()));
            j.setBounds(5+(i*42),200,39,58);
            add(j);
            apresentacaoPecasMesa.add(j);
        }

        //JLabel j = new JLabel(new ImageIcon(t.getVerdicalPecaURL()) );

        // TODO: Desenhar as peccas

       QuadroAvisos(controle.getTextoAviso());
       repaint();
    }

    class mousePecasListenner implements MouseListener {

        public mousePecasListenner() {

        }

        public void mouseClicked(MouseEvent arg0) {
            JLabel j = (JLabel) arg0.getSource();
            int i = apresentacaoMaoJ1.indexOf(j);
            if (i < 0)
            {
                i = apresentacaoMaoJ2.indexOf(j);
                Tile t = (Tile) controle.getMaoJogador2().get(i);
                System.out.println("peca clicada foi a "+t.getLado1()+"  "+t.getLado2());
                if (controle.MPisRunningMultplayer() == true)
                {
                    MPprocessaJogadaIndex(i,2);
                    try {
                        controle.MPProcessRemoteJogar();
                    } catch (RemoteException ex) {
                        Logger.getLogger(MesaDominous.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else
                {
                    processaJogadaIndex(i,2);
                }

            }else
            {
//                Tile t = (Tile) controle.getMaoJogador1().get(i);
//                processaJogada(t);
//                System.out.println("peca clicada foi a "+t.getLado1()+"  "+t.getLado2());
                if (controle.MPisRunningMultplayer() == true)
                {
                    MPprocessaJogadaIndex(i, 1);
                    try {
                        controle.MPProcessRemoteJogar();
                    } catch (RemoteException ex) {
                        Logger.getLogger(MesaDominous.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
                else
                {
                    processaJogadaIndex(i,1);
                }
            }
        }

        public void mousePressed(MouseEvent arg0) {

        }

        public void mouseReleased(MouseEvent arg0) {

        }

        public void mouseEntered(MouseEvent arg0) {

        }

        public void mouseExited(MouseEvent arg0) {
            
        }

}



}
